(function() {
    var o = this,
    A = o._,
    r = typeof StopIteration !== "undefined" ? StopIteration: "__break__",
    k = Array.prototype,
    m = Object.prototype,
    i = k.slice,
    B = k.unshift,
    C = m.toString,
    p = m.hasOwnProperty,
    s = k.forEach,
    t = k.map,
    u = k.reduce,
    v = k.reduceRight,
    w = k.filter,
    x = k.every,
    y = k.some,
    n = k.indexOf,
    z = k.lastIndexOf;
    m = Array.isArray;
    var D = Object.keys,
    c = function(a) {
        return new l(a)
    };
    if (typeof exports !== "undefined") exports._ = c;
    o._ = c;
    c.VERSION = "1.1.1";
    var j = c.each = c.forEach = function(a, b, d) {
        try {
            if (s && a.forEach === s) a.forEach(b, d);
            else if (c.isNumber(a.length)) for (var e =
            0, f = a.length; e < f; e++) b.call(d, a[e], e, a);
            else for (e in a) p.call(a, e) && b.call(d, a[e], e, a)
        } catch(g) {
            if (g != r) throw g;
        }
        return a
    };
    c.map = function(a, b, d) {
        if (t && a.map === t) return a.map(b, d);
        var e = [];
        j(a,
        function(f, g, h) {
            e[e.length] = b.call(d, f, g, h)
        });
        return e
    };
    c.reduce = c.foldl = c.inject = function(a, b, d, e) {
        if (u && a.reduce === u) {
            if (e) b = c.bind(b, e);
            return a.reduce(b, d)
        }
        j(a,
        function(f, g, h) {
            d = b.call(e, d, f, g, h)
        });
        return d
    };
    c.reduceRight = c.foldr = function(a, b, d, e) {
        if (v && a.reduceRight === v) {
            if (e) b = c.bind(b, e);
            return a.reduceRight(b,
            d)
        }
        a = (c.isArray(a) ? a.slice() : c.toArray(a)).reverse();
        return c.reduce(a, b, d, e)
    };
    c.detect = function(a, b, d) {
        var e;
        j(a,
        function(f, g, h) {
            if (b.call(d, f, g, h)) {
                e = f;
                c.breakLoop()
            }
        });
        return e
    };
    c.filter = c.select = function(a, b, d) {
        if (w && a.filter === w) return a.filter(b, d);
        var e = [];
        j(a,
        function(f, g, h) {
            if (b.call(d, f, g, h)) e[e.length] = f
        });
        return e
    };
    c.reject = function(a, b, d) {
        var e = [];
        j(a,
        function(f, g, h) {
            b.call(d, f, g, h) || (e[e.length] = f)
        });
        return e
    };
    c.every = c.all = function(a, b, d) {
        b = b || c.identity;
        if (x && a.every === x) return a.every(b,
        d);
        var e = true;
        j(a,
        function(f, g, h) { (e = e && b.call(d, f, g, h)) || c.breakLoop()
        });
        return e
    };
    c.some = c.any = function(a, b, d) {
        b = b || c.identity;
        if (y && a.some === y) return a.some(b, d);
        var e = false;
        j(a,
        function(f, g, h) {
            if (e = b.call(d, f, g, h)) c.breakLoop()
        });
        return e
    };
    c.include = function(a, b) {
        if (n && a.indexOf === n) return a.indexOf(b) != -1;
        var d = false;
        j(a,
        function(e) {
            if (d = e === b) c.breakLoop()
        });
        return d
    };
    c.invoke = function(a, b) {
        var d = i.call(arguments, 2);
        return c.map(a,
        function(e) {
            return (b ? e[b] : e).apply(e, d)
        })
    };
    c.pluck = function(a,
    b) {
        return c.map(a,
        function(d) {
            return d[b]
        })
    };
    c.max = function(a, b, d) {
        if (!b && c.isArray(a)) return Math.max.apply(Math, a);
        var e = {
            computed: -Infinity
        };
        j(a,
        function(f, g, h) {
            g = b ? b.call(d, f, g, h) : f;
            g >= e.computed && (e = {
                value: f,
                computed: g
            })
        });
        return e.value
    };
    c.min = function(a, b, d) {
        if (!b && c.isArray(a)) return Math.min.apply(Math, a);
        var e = {
            computed: Infinity
        };
        j(a,
        function(f, g, h) {
            g = b ? b.call(d, f, g, h) : f;
            g < e.computed && (e = {
                value: f,
                computed: g
            })
        });
        return e.value
    };
    c.sortBy = function(a, b, d) {
        return c.pluck(c.map(a,
        function(e, f,
        g) {
            return {
                value: e,
                criteria: b.call(d, e, f, g)
            }
        }).sort(function(e, f) {
            var g = e.criteria,
            h = f.criteria;
            return g < h ? -1: g > h ? 1: 0
        }), "value")
    };
    c.sortedIndex = function(a, b, d) {
        d = d || c.identity;
        for (var e = 0, f = a.length; e < f;) {
            var g = e + f >> 1;
            d(a[g]) < d(b) ? (e = g + 1) : (f = g)
        }
        return e
    };
    c.toArray = function(a) {
        if (!a) return [];
        if (a.toArray) return a.toArray();
        if (c.isArray(a)) return a;
        if (c.isArguments(a)) return i.call(a);
        return c.values(a)
    };
    c.size = function(a) {
        return c.toArray(a).length
    };
    c.first = c.head = function(a, b, d) {
        return b && !d ? i.call(a,
        0, b) : a[0]
    };
    c.rest = c.tail = function(a, b, d) {
        return i.call(a, c.isUndefined(b) || d ? 1: b)
    };
    c.last = function(a) {
        return a[a.length - 1]
    };
    c.compact = function(a) {
        return c.filter(a,
        function(b) {
            return !! b
        })
    };
    c.flatten = function(a) {
        return c.reduce(a,
        function(b, d) {
            if (c.isArray(d)) return b.concat(c.flatten(d));
            b[b.length] = d;
            return b
        },
        [])
    };
    c.without = function(a) {
        var b = i.call(arguments, 1);
        return c.filter(a,
        function(d) {
            return ! c.include(b, d)
        })
    };
    c.uniq = function(a, b) {
        return c.reduce(a,
        function(d, e, f) {
            if (0 == f || (b === true ? c.last(d) !=
            e: !c.include(d, e))) d[d.length] = e;
            return d
        },
        [])
    };
    c.intersect = c.contains = function(a) {
        var b = i.call(arguments, 1);
        return c.filter(c.uniq(a),
        function(d) {
            return c.every(b,
            function(e) {
                return c.indexOf(e, d) >= 0
            })
        })
    };
    c.zip = function() {
        for (var a = i.call(arguments), b = c.max(c.pluck(a, "length")), d = new Array(b), e = 0; e < b; e++) d[e] = c.pluck(a, "" + e);
        return d
    };
    c.indexOf = function(a, b) {
        if (n && a.indexOf === n) return a.indexOf(b);
        for (var d = 0, e = a.length; d < e; d++) if (a[d] === b) return d;
        return - 1
    };
    c.lastIndexOf = function(a, b) {
        if (z && a.lastIndexOf ===
        z) return a.lastIndexOf(b);
        for (var d = a.length; d--;) if (a[d] === b) return d;
        return - 1
    };
    c.range = function(a, b, d) {
        var e = i.call(arguments),
        f = e.length <= 1;
        a = f ? 0: e[0];
        b = f ? e[0] : e[1];
        d = e[2] || 1;
        e = Math.max(Math.ceil((b - a) / d), 0);
        f = 0;
        for (var g = new Array(e); f < e;) {
            g[f++] = a;
            a += d
        }
        return g
    };
    c.bind = function(a, b) {
        var d = i.call(arguments, 2);
        return function() {
            return a.apply(b || {},
            d.concat(i.call(arguments)))
        }
    };
    c.bindAll = function(a) {
        var b = i.call(arguments, 1);
        if (b.length == 0) b = c.functions(a);
        j(b,
        function(d) {
            a[d] = c.bind(a[d], a)
        });
        return a
    };
    c.memoize = function(a, b) {
        var d = {};
        b = b || c.identity;
        return function() {
            var e = b.apply(this, arguments);
            return e in d ? d[e] : (d[e] = a.apply(this, arguments))
        }
    };
    c.delay = function(a, b) {
        var d = i.call(arguments, 2);
        return setTimeout(function() {
            return a.apply(a, d)
        },
        b)
    };
    c.defer = function(a) {
        return c.delay.apply(c, [a, 1].concat(i.call(arguments, 1)))
    };
    c.wrap = function(a, b) {
        return function() {
            var d = [a].concat(i.call(arguments));
            return b.apply(b, d)
        }
    };
    c.compose = function() {
        var a = i.call(arguments);
        return function() {
            for (var b =
            i.call(arguments), d = a.length - 1; d >= 0; d--) b = [a[d].apply(this, b)];
            return b[0]
        }
    };
    c.keys = D ||
    function(a) {
        if (c.isArray(a)) return c.range(0, a.length);
        var b = [];
        for (var d in a) if (p.call(a, d)) b[b.length] = d;
        return b
    };
    c.values = function(a) {
        return c.map(a, c.identity)
    };
    c.functions = c.methods = function(a) {
        return c.filter(c.keys(a),
        function(b) {
            return c.isFunction(a[b])
        }).sort()
    };
    c.extend = function(a) {
        j(i.call(arguments, 1),
        function(b) {
            for (var d in b) a[d] = b[d]
        });
        return a
    };
    c.clone = function(a) {
        return c.isArray(a) ? a.slice(0) :
        c.extend({},
        a)
    };
    c.tap = function(a, b) {
        b(a);
        return a
    };
    c.isEqual = function(a, b) {
        if (a === b) return true;
        var d = typeof a;
        if (d != typeof b) return false;
        if (a == b) return true;
        if (!a && b || a && !b) return false;
        if (a.isEqual) return a.isEqual(b);
        if (c.isDate(a) && c.isDate(b)) return a.getTime() === b.getTime();
        if (c.isNaN(a) && c.isNaN(b)) return false;
        if (c.isRegExp(a) && c.isRegExp(b)) return a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline;
        if (d !== "object") return false;
        if (a.length && a.length !==
        b.length) return false;
        d = c.keys(a);
        var e = c.keys(b);
        if (d.length != e.length) return false;
        for (var f in a) if (! (f in b) || !c.isEqual(a[f], b[f])) return false;
        return true
    };
    c.isEmpty = function(a) {
        if (c.isArray(a) || c.isString(a)) return a.length === 0;
        for (var b in a) if (p.call(a, b)) return false;
        return true
    };
    c.isElement = function(a) {
        return !! (a && a.nodeType == 1)
    };
    c.isArray = m ||
    function(a) {
        return !! (a && a.concat && a.unshift && !a.callee)
    };
    c.isArguments = function(a) {
        return !! (a && a.callee)
    };
    c.isFunction = function(a) {
        return !! (a && a.constructor &&
        a.call && a.apply)
    };
    c.isString = function(a) {
        return !! (a === "" || a && a.charCodeAt && a.substr)
    };
    c.isNumber = function(a) {
        return a === +a || C.call(a) === "[object Number]"
    };
    c.isBoolean = function(a) {
        return a === true || a === false
    };
    c.isDate = function(a) {
        return !! (a && a.getTimezoneOffset && a.setUTCFullYear)
    };
    c.isRegExp = function(a) {
        return !! (a && a.test && a.exec && (a.ignoreCase || a.ignoreCase === false))
    };
    c.isNaN = function(a) {
        return c.isNumber(a) && isNaN(a)
    };
    c.isNull = function(a) {
        return a === null
    };
    c.isUndefined = function(a) {
        return typeof a ==
        "undefined"
    };
    c.noConflict = function() {
        o._ = A;
        return this
    };
    c.identity = function(a) {
        return a
    };
    c.times = function(a, b, d) {
        for (var e = 0; e < a; e++) b.call(d, e)
    };
    c.breakLoop = function() {
        throw r;
    };
    c.mixin = function(a) {
        j(c.functions(a),
        function(b) {
            E(b, c[b] = a[b])
        })
    };
    var F = 0;
    c.uniqueId = function(a) {
        var b = F++;
        return a ? a + b: b
    };
    c.templateSettings = {
        evaluate: /<%([\s\S]+?)%>/g,
        interpolate: /<%=([\s\S]+?)%>/g
    };
    c.template = function(a, b) {
        var d = c.templateSettings;
        d = "var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('" +
        a.replace(/'/g, "\\'").replace(d.interpolate,
        function(e, f) {
            return "'," + f.replace(/\\'/g, "'") + ",'"
        }).replace(d.evaluate || null,
        function(e, f) {
            return "');" + f.replace(/\\'/g, "'").replace(/[\r\n\t]/g, " ") + "__p.push('"
        }).replace(/\r/g, "\\r").replace(/\n/g, "\\n").replace(/\t/g, "\\t") + "');}return __p.join('');";
        d = new Function("obj", d);
        return b ? d(b) : d
    };
    var l = function(a) {
        this._wrapped = a
    };
    c.prototype = l.prototype;
    var q = function(a, b) {
        return b ? c(a).chain() : a
    },
    E = function(a, b) {
        l.prototype[a] = function() {
            var d = i.call(arguments);
            B.call(d, this._wrapped);
            return q(b.apply(c, d), this._chain)
        }
    };
    c.mixin(c);
    j(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"],
    function(a) {
        var b = k[a];
        l.prototype[a] = function() {
            b.apply(this._wrapped, arguments);
            return q(this._wrapped, this._chain)
        }
    });
    j(["concat", "join", "slice"],
    function(a) {
        var b = k[a];
        l.prototype[a] = function() {
            return q(b.apply(this._wrapped, arguments), this._chain)
        }
    });
    l.prototype.chain = function() {
        this._chain = true;
        return this
    };
    l.prototype.value = function() {
        return this._wrapped
    }
})();
